Elastic Stack部署使用

11345 字
57 分钟
Elastic Stack部署使用

一 、elk stack 简述#

ELK 早期是 Elasticsearch + Logstash + Kibana 三个组件的简称,现在官方统一命名为 Elastic Stack,增加了 Beats 系列采集组件,专门用来做日志收集、日志清洗、存储检索、可视化分析、告警,是运维最主流的日志解决方案。

1.1 核心三大件#

  1. Elasticsearch 分布式搜索引擎、存储引擎。 负责存储、索引、检索日志 / 数据,提供 RESTful API,底层基于 Lucene。
  2. Logstash 数据采集处理管道。 负责接收、过滤、转换、输出数据;支持丰富输入输出插件,对日志做清洗、格式化、字段提取。
  3. Kibana 可视化 Web 界面。 对接 Elasticsearch,做日志查询、图表、仪表盘、告警,Web 操作 ES。

1.2 常用配套组件(扩展)#

1.2.1 Beats#

轻量采集器,替代 Logstash 做客户端采集,部署在业务服务器上。

  • Filebeat:采集日志文件(最常用)
  • Metricbeat:采集系统 / 服务指标(CPU、内存、进程、数据库)
  • Packetbeat:网络流量抓包分析
  • Heartbeat:服务存活探测(uptime 监控)
  • Auditbeat:系统审计日志采集

典型架构:Filebeat → Logstash → Elasticsearch ← Kibana

经典数据流:业务机器(Filebeat) → Logstash(清洗) → Elasticsearch(存储索引) ← Kibana(查看)

很多生产环境:Filebeat 直接输出 ES,省略 Logstash,简化架构。

简单区分:Logstash:功能强、占资源,适合服务端集中处理;Beats:轻量,部署在业务机器上做采集

1.2.2 其他重要组件#

  • Elastic Agent:新一代统一代理,可以整合所有 Beats 功能,单 agent 采集日志 + 指标 + 安全数据。
  • APM Server:应用性能监控,收集链路追踪、应用指标、错误日志。
  • Elasticsearch Security:安全模块,权限、认证、加密。
  • Logstash Pipeline:管道处理,也支持持久队列防止丢数据。

二、elk stack组件安装#

2.1 Elasticsearch部署#

官网地址:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/installing-elasticsearch

安装文档:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-elasticsearch-from-archive-on-linux-macos

开源地址:https://github.com/elastic/elasticsearch

下载地址:https://www.elastic.co/cn/downloads/elasticsearch

查看版本支持的操作系统:https://www.elastic.co/support/matrix

2.1.1 下载二进制包并配置#

下载 Elasticsearch 二进制包,并指定解压到 /usr/local 目录下,并重命名为 elasticsearch

Terminal window
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-9.5.2-linux-x86_64.tar.gz
tar -xzf elasticsearch-9.5.2-linux-x86_64.tar.gz
mv elasticsearch-9.5.2 /usr/local/elasticsearch

配置环境变量:

Terminal window
cat > /etc/profile.d/elasticsearch.sh <<'EOF'
export ES_HOME=/usr/local/elasticsearch
export PATH=$PATH:$ES_HOME/bin
EOF
source /etc/profile

验证版本:

Terminal window
[root@localhost /root]# elasticsearch -V
warning: ignoring JAVA_HOME=/usr/local/java/jdk; using bundled JDK
Version: 9.5.2, Build: tar/b42549c72e6e040825b13e5d8ebf7ff63886b24d/2026-08-18T10:07:58.745010960Z, JVM: 26.0.2

2.1.2 ES环境配置#

  1. 调整系统底层参数:
Terminal window
# 调整虚拟内存(vm.max_map_count)
sysctl -w vm.max_map_count=655360
# 写入配置文件使其永久生效
echo "vm.max_map_count=655360" >> /etc/sysctl.conf
# 重新加载
sysctl -p
# 验证配置
sysctl vm.max_map_count
  1. 调整文件描述符限制:编辑 /etc/security/limits.conf,添加以下配置:

    修改elk用户的文件描述符限制

Terminal window
cat >> /etc/security/limits.conf << 'EOF'
elk soft nofile 65535
elk hard nofile 65535
EOF
  1. 创建专用用户并赋权:

    Elasticsearch 禁止使用 root 用户启动。需要创建专用用户并赋予安装目录权限:

Terminal window
# 创建 elk 用户组
groupadd -r elk
# 创建 elk 用户,指定主组为 elk,并限制登录和家目录
useradd -r -g elk -s /sbin/nologin -M elk
# 赋予目录权限
chown -R elk:elk /usr/local/elasticsearch
  1. 创建数据目录并赋权:

    /usr/local/elk/data/es目录中创建两个目录分别为datalogs,分别存放数据和日志:

Terminal window
mkdir -p /usr/local/elk/data/es/{data,logs}

赋予 elk 用户和 elk 组所有权:

Terminal window
chown -R elk:elk /usr/local/elk

2.1.3 ES配置文件修改#

elasticsearch.yml 是 Elasticsearch 主要的配置文件,包含了很多参数信息。在 /usr/local/elasticsearch/config 目录下,编辑 elasticsearch.yml文件,配置以下内容:

Terminal window
# 备份原配置文件
cp /usr/local/elasticsearch/config/elasticsearch.yml{,.bak}
# 指定集群名称:
sed -i '/#cluster.name/c cluster.name: es-cluster' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定节点名称:node-1
sed -i '/#node.name/c node.name: node-1' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定ES索引数据存储路径
sed -i '/#path.data/c path.data: /usr/local/elk/data/es/data' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定日志文件存储路径
sed -i '/#path.logs/c path.logs: /usr/local/elk/data/es/logs' /usr/local/elasticsearch/config/elasticsearch.yml
# 设置锁定内存以防止交换
sed -i '/#bootstrap.memory_lock/c bootstrap.memory_lock: true' /usr/local/elasticsearch/config/elasticsearch.yml
# 设置ES监听所有网络接口的请求
sed -i '/#network.host/c network.host: 0.0.0.0' /usr/local/elasticsearch/config/elasticsearch.yml
# 指定Elasticsearch HTTP服务的端口。默认是9200
sed -i '/#http.port/c http.port: 9200' /usr/local/elasticsearch/config/elasticsearch.yml

**注意:**目前是单节点运行,因此需要进行以下配置:

Terminal window
# 在 cluster.name这一行的下方插入discovery.type: single-node
sed -i '/^cluster.name/a discovery.type: single-node' /usr/local/elasticsearch/config/elasticsearch.yml
# 注释初始主节点配置
sed -i 's/^cluster.initial_master_nodes/# cluster.initial_master_nodes: ["localhost"]/' /usr/local/elasticsearch/config/elasticsearch.yml

2.1.4 修改 JVM 内存配置#

Elasticsearch 的 JVM 配置文件 /usr/local/elasticsearch/jvm.options ,这个文件用于配置 Elasticsearch 运行时的 JVM(Java 虚拟机)选项,包括堆内存的初始大小( -Xms )和最大大小( -Xmx )。编辑 jvm.options 文件,修改以下内容:

Terminal window
# 指定 Elasticsearch 进程的初始堆内存大小
sed -i 's/## -Xms4g/-Xms2g/g' /usr/local/elasticsearch/config/jvm.options
# 指定 Elasticsearch 进程的最大堆内存大小
sed -i 's/## -Xmx4g/-Xmx2g/g' /usr/local/elasticsearch/config/jvm.options

2.1.5 配置启动服务并启动#

创建一个名为 elasticsearch.service 的 systemd 服务单元文件,用于管理 Elasticsearch 服务,存放于/usr/lib/systemd/system目录下:

Terminal window
cat > /usr/lib/systemd/system/elasticsearch.service <<'EOF'
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Type=forking
User=elk
Group=elk
NotifyAccess=all
RuntimeDirectory=elasticsearch
PrivateTmp=true
Environment=ES_HOME=/usr/local/elasticsearch
Environment=ES_PATH_CONF=/usr/local/elasticsearch/config
Environment=ES_SD_NOTIFY=true
WorkingDirectory=/usr/local/elasticsearch
ExecStart=/usr/local/elasticsearch/bin/elasticsearch -d -p pid
StandardOutput=journal
StandardError=inherit
LimitNOFILE=65535
LimitNPROC=4096
LimitAS=infinity
LimitFSIZE=infinity
LimitMEMLOCK=infinity
TimeoutStopSec=0
KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143
TimeoutStartSec=900
[Install]
WantedBy=multi-user.target
EOF
Terminal window
# 重载配置
systemctl daemon-reload
# 启动服务
systemctl start elasticsearch.service

首次启动 Elasticsearch 节点时,它会自动执行以下安全设置:

  • 为传输层和 HTTP 层生成TLS 证书,对应 /usr/local/elasticsearch/config/certs 目录;
  • 将 TLS 配置设置应用于 elasticsearch.yml ,即结尾的内容;
  • elastic 超级用户设置密码。

2.1.6 设置 elastic 用户密码#

执行以下命令,为内置的 elastic 用户设置一个密码,这里设置为admin@123

Terminal window
[root@localhost /usr/local/elasticsearch]# elasticsearch-reset-password -u elastic -i
warning: ignoring JAVA_HOME=/usr/local/java/jdk; using bundled JDK
This tool will reset the password of the [elastic] user.
You will be prompted to enter the password.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Re-enter password for [elastic]:
Password for the [elastic] user successfully reset.

内置用户:

用户名作用
elastic超级用户
kibana_system用于负责Kibana连接Elasticsearch
logstash_systemLogstash将监控信息存储在Elasticsearch中时使用
beats_systemBeats在Elasticsearch中存储监视信息时使用
apm_systemAPM服务器在Elasticsearch中存储监视信息时使用
remote_monitoring_userMetricbeat用户在Elasticsearch中收集和存储监视信息时使用

密码管理:

Terminal window
# 设置用户密码
elasticsearch-setup-passwords interactive
# 重置密码,随机生成
elasticsearch-reset-password -u elastic
# 重置密码,指定密码
elasticsearch-reset-password -u elastic -i
# 随机密码
elasticsearch-setup-passwords auto

2.1.7 访问ES#

浏览器访问 Elasticsearch 平台地址 https://<IP>:9200 ,在弹出的窗口中输入用户名为 elastic ,密码为之前设置的 admin@123 ,进行登录。登录成功后将出现以下内容:

Terminal window
{
"name" : "node-1",
"cluster_name" : "es-cluster",
"cluster_uuid" : "h8z6N-qAQD6PYN_kfsvCYg",
"version" : {
"number" : "9.5.2",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "b42549c72e6e040825b13e5d8ebf7ff63886b24d",
"build_date" : "2026-08-18T10:07:58.745010960Z",
"build_snapshot" : false,
"lucene_version" : "10.5.1",
"minimum_wire_compatibility_version" : "8.19.0",
"minimum_index_compatibility_version" : "8.0.0"
},
"tagline" : "You Know, for Search"
}

2.1.8 调用API查看ES#

Terminal window
# 查看内置用户
curl -sk -u elastic:admin@123 "https://localhost:9200/_security/user" | jq
# 只提取出所用的用户
curl -sk -u elastic:admin@123 "https://localhost:9200/_security/user" | jq -r 'keys[]'
# 集群状态
curl -k -u elastic:admin@123 https://localhost:9200/_cluster/health?pretty
# 节点状态
curl -k -u elastic:admin@123 https://localhost:9200/_nodes/process?pretty
# 分片状态
curl -k -u elastic:admin@123 https://localhost:9200/_cat/shards
# 索引分片存储信息
curl -k -u elastic:admin@123 https://localhost:9200/index/_shard_stores?pretty
# 索引状态
curl -k -u elastic:admin@123 https://localhost:9200/index/_stats?pretty
# 索引元数据
curl -k -u elastic:admin@123 https://localhost:9200/index?pretty
# 索引信息
curl -k -u elastic:admin@123 https://localhost:9200/_cat/indices?v
# 节点信息
curl -k -u elastic:admin@123 https://localhost:9200/_cat/nodes?v

2.2 Kibana部署#

官网地址:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana

安装文档:https://www.elastic.co/docs/deploy-manage/deploy/self-managed/install-kibana-from-archive-on-linux-macos

开源地址:https://github.com/elastic/kibana/

下载地址:https://www.elastic.co/cn/downloads/kibana

Kibana 是 Elastic Stack(ELK)的Web 可视化前端组件,基于 Node.js 开发,专门对接 Elasticsearch,提供浏览器操作 ES 的界面。

一、核心作用:

  1. 日志检索(Discover):查看、过滤、搜索 ES 里存储的日志,按时间、关键词、字段排查问题。
  2. 数据可视化:将 ES 数据做成折线图、饼图、表格等图表。
  3. 仪表盘 Dashboard:把多个图表组合成监控大屏,直观展示指标。
  4. 开发工具 Dev Tools:直接执行 ES 的 REST API,调试查询语句。
  5. 告警与报告:根据日志条件触发告警,生成报表。
  6. 权限管理(X‑Pack):用户、角色控制,限制不同人员访问不同索引。

二、注意点:

  • 本身不存储数据,所有数据都来自 Elasticsearch;
  • 需要和 ES 版本严格保持一致,版本不匹配会报错;
  • 常用端口:5601
  • 可以配置索引模式,告诉 Kibana 读取 ES 哪些索引。

2.2.1 下载二进制包并配置环境#

下载 Kibana 二进制包,并指定解压到 /usr/local 目录下,并重命名为 kibana

Terminal window
cd /usr/local/src/
wget https://artifacts.elastic.co/downloads/kibana/kibana-9.5.2-linux-x86_64.tar.gz
tar -xzf kibana-9.5.2-linux-x86_64.tar.gz
mv kibana-9.5.2 /usr/local/kibana
chown -R elk:elk /usr/local/kibana

创建数据目录,并给目录赋权

Terminal window
mkdir -p /usr/local/elk/data/kibana/{data,logs}
chown -R elk:elk /usr/local/elk/data/kibana

2.2.2 Kibana配置文件修改#

kibana.yml是 Kibana 主要的配置文件,包含了很多参数信息。在 /usr/local/kibana/config 目录下,编辑 kibana.yml 文件,配置以下内容:

Terminal window
# 备份原配置文件
cp /usr/local/kibana/config/kibana.yml{,.bak}
# 修改新配置文件
cat > /usr/local/kibana/config/kibana.yml <<EOF
# 监听端口
server.port: 5601
server.host: "0.0.0.0"
# 指定Kibana在生成URL时使用的基础URL
server.publicBaseUrl: "http://$(hostname -I | awk '{print $1}')"
# 指定Kibana数据存储路径
path.data: /usr/local/elk/data/kibana/data
# 配置Kibana的日志记录设置,指示将日志记录到指定的文件中
logging.appenders.default:
type: file
fileName: /usr/local/elk/data/kibana/logs/kibana.log
layout:
type: json
EOF

2.2.3 配置启动服务并启动#

创建一个名为 kibana.service 的 systemd 服务单元文件,用于管理 Kibana 服务,存放于/usr/lib/systemd/system目录下:

Terminal window
cat > /usr/lib/systemd/system/kibana.service <<'EOF'
[Unit]
Description=Kibana
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=elk
Group=elk
PrivateTmp=true
Environment=KBN_HOME=/usr/local/kibana
Environment=KBN_PATH_CONF=/usr/local/kibana/config
WorkingDirectory=/usr/local/kibana
ExecStart=/usr/local/kibana/bin/kibana
StandardOutput=journal
StandardError=inherit
Restart=on-failure
RestartSec=3
StartLimitBurst=3
StartLimitInterval=60
[Install]
WantedBy=multi-user.target
EOF
Terminal window
# 重载配置
systemctl daemon-reload
# 启动服务
systemctl start kibana.service

2.2.4 生成注册令牌并访问Kibana#

ES重新生成新的注册令牌

Terminal window
# -s参数即 --scope参数,用来指定生成的token用途。
elasticsearch-create-enrollment-token -s kibana
# 输出信息如下
eyJ2ZXIiOiI4LjE0LjAiLCJhZHIiOlsiMTAuMjIuNTEuOTE6OTIwMCJdLCJmZ3IiOiI3ZmM1ZGMzMmNmMjg4NjA2ZGE5ZWFiNTNmZTU1MDNlZmU4YWU0ZDIzNDBlNzJlMzE4MDY4N2UzYzExY2Q1NGRkIiwia2V5IjoidUNUMVZxQUJmWmJmekptLWpEbXY6UldNYURmQlVxN3hPUF94dXZnUEREdyJ9

浏览器访问 Kibana 平台地址 <IP>:5601 ,输入生成的注册令牌,然后点击配置Elastic

之后需要在Kibana服务器运行bin\kibana-verification-code获取验证码,然后输入

Terminal window
[root@localhost /usr/local/kibana/bin]# ./kibana-verification-code
Your verification code is: 568 767

在浏览器上配置Kibana完毕后,回到后台,查看 kibana.yml 文件,结尾会自动新增配置。该配置在后续部署Logstash时会用到

Terminal window
[root@localhost /usr/local/kibana/bin]# cat /usr/local/kibana/config/kibana.yml | tail -n5
elasticsearch.hosts: [https://10.22.51.91:9200]
elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3ODgxNjU3NTk4NzQ6ZlEzbkZvRG1SQ1dQY1Q1SnFid01EUQ
elasticsearch.ssl.certificateAuthorities: [/usr/local/kibana/data/ca_1788165761022.crt]
xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [https://10.22.51.91:9200], ca_trusted_fingerprint: 7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd}]

Search Autocomplete搜索自动完成设置:

  • elasticsearch.hosts:定义 Kibana 要连接的 Elasticsearch 节点地址。
  • elasticsearch.serviceAccountToken:这是一个 Service Account Token(服务账户令牌),Kibana 启动时用它来认证自己,而不是用用户名/密码。
  • elasticsearch.ssl.certificateAuthorities: 指定 CA 根证书文件路径,Kibana 会用这个证书去验证 Elasticsearch 的 HTTPS 证书,确保连接的是真实可信的 ES 节点,而不是中间人攻击。这个 .crt 文件是 ES 第一次启动时自动生成的,通常会被 Kibana enrollment 过程复制过来。
  • xpack.fleet.outputs:这是 Fleet(Elastic Agent 管理功能) 的输出配置。Kibana 里的 Fleet 需要知道往哪里写数据,这里配置了一个默认的 Elasticsearch 输出。关键字段:
  • id: fleet-default-output:输出 ID。
  • name: default:输出名称。
  • is_default: true:是否作为默认输出。
  • is_default_monitoring: true:是否作为监控默认输出。
  • type: elasticsearch:输出类型是 Elasticsearch。
  • hosts: [https://10.22.51.91:9200]:输出目标 ES 节点。
  • ca_trusted_fingerprint:CA 证书指纹,用来验证 TLS 连接的安全性。

2.3 Logstash部署#

官网地址:https://www.elastic.co/docs/reference/logstash

安装文档:https://www.elastic.co/docs/reference/logstash/installing-logstash

开源地址:https://github.com/elastic/logstash

下载地址:https://www.elastic.co/cn/downloads/logstash

Logstash 是 Elastic Stack 的数据处理管道工具,Java 编写,用来做日志 / 数据的接收、清洗转换、转发输出。

三大核心模块:

  1. Input 输入:接收数据源,支持 file、beats、kafka、syslog、tcp 等,获取原始数据。
  2. Filter 过滤(核心):数据清洗,切割文本、提取字段、时间格式化、数据过滤、数据脱敏、字段增删改。
  3. Output 输出:处理完成后输出,最常见输出到 Elasticsearch,也可输出 kafka、文件、redis 等。

特点:

  • 插件生态极其丰富,各类输入、过滤、输出都有插件;
  • 资源消耗较高,占用 CPU 内存大,生产环境一般集中部署,不装在业务服务器上;
  • 常接收 Filebeat 推送过来的数据,做集中清洗;
  • 自带持久队列,防止宕机丢失数据。

典型定位:

  • Filebeat 负责采集,Logstash 负责清洗加工,加工完交给 Elasticsearch 存储。

  • 如果日志已经是规整 JSON 格式,可跳过 Logstash,Filebeat 直接写入 ES,减少组件开销。

2.3.1 下载二进制包并配置环境#

下载 Logstash 二进制包,并指定解压到 /usr/local 目录下,并重命名为 logstash

Terminal window
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/logstash/logstash-9.5.2-linux-x86_64.tar.gz
tar -xf logstash-9.5.2-linux-x86_64.tar.gz
mv logstash-9.5.2 /usr/local/logstash

配置环境变量:

Terminal window
echo 'export PATH=$PATH:/usr/local/logstash/bin' > /etc/profile.d/logstash.sh
source /etc/profile

验证版本:

Terminal window
[root@localhost /root]# logstash -V
Using bundled JDK: /usr/local/logstash/jdk
logstash 9.5.2

2.3.2 配置Logstash#

通过 chown 命令递归地更改 /usr/local/logstash 目录及其所有子目录和文件的所有权,赋予 elk 用户和 elk 组所有权:

Terminal window
chown -R elk:elk /usr/local/logstash/

/usr/local/elk/data/logstash目录下创建两个目录分别为datalogs,分别存放数据和日志。同时授予权限:

Terminal window
mkdir -p /usr/local/elk/data/logstash/{data,logs}
chown -R elk:elk /usr/local/elk/data/logstash

复制 Elasticsearch 证书到 Logstash 目录并赋权:

Terminal window
mkdir /usr/local/logstash/config/certs
cp /usr/local/elasticsearch/config/certs/http_ca.crt /usr/local/logstash/config/certs
chmod 660 /usr/local/logstash/config/certs/http_ca.crt
chown -R elk:elk /usr/local/logstash/config/certs

2.3.3 修改logstash配置文件#

logstash.yml 是 Logstash 主要的配置文件,包含了很多参数信息。在 /usr/local/logstash/config 目录下,编辑 logstash.yml 文件,配置以下内容,其中**【X-Pack Settings】配置**可以从前面配置Kibana时自动生成到配置文件中的最后的内容信息中获取:

Terminal window
# 备份原配置文件
cp /usr/local/logstash/config/logstash.yml{,.bak}
# 修改新配置文件
cat > /usr/local/logstash/config/logstash.yml <<'EOF'
# 指定 Logstash 用于存储数据的路径
path.data: /usr/local/elk/data/logstash/data
log.level: info
# 指定 Logstash 日志文件的存储路径
path.logs: /usr/local/elk/data/logstash/logs
# 启用 X-Pack 监控功能,允许 Logstash 发送监控数据到 Elasticsearch
xpack.monitoring.enabled: true
# 连接 Elasticsearch 的认证信息
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: admin@123
# 指定用于监控的 Elasticsearch 集群的地址
xpack.monitoring.elasticsearch.hosts: ["https://localhost:9200"]
# 指定用于验证 Elasticsearch 集群 SSL 连接的 CA 证书路径。
xpack.monitoring.elasticsearch.ssl.certificate_authority: "/usr/local/logstash/config/certs/http_ca.crt"
EOF

2.3.4 修改startup.options 文件#

startup.options 是 Logstash 的一个配置文件,用于定义 Logstash 启动时使用的一些系统级参数和设置。该文件通常用于配置 Logstash 作为系统服务运行时的参数,例如指定 JVM 内存设置、日志路径等。配置完成后,这些选项会被应用于 systemd 或其他服务管理器,以便正确启动和管理 Logstash 服务。

/usr/local/logstash/config 目录下,编辑 startup.options 文件,配置以下内容:

Terminal window
# 指定 Logstash 安装的位置
sed -i '/LS_HOME=/c LS_HOME=/usr/local/logstash' /usr/local/logstash/config/startup.options
# 指定 Logstash 配置文件的目录
sed -i '/LS_SETTINGS_DIR=/c LS_SETTINGS_DIR=/usr/local/logstash/config' /usr/local/logstash/config/startup.options
# 指定运行 Logstash 的用户和用户组。
sed -i '/LS_USER=/c LS_USER=elk' /usr/local/logstash/config/startup.options
sed -i '/LS_GROUP=/c LS_GROUP=elk' /usr/local/logstash/config/startup.options

2.3.5 修改pipelines.yml文件#

pipelines.yml 是 Logstash 的一个配置文件,用于定义和管理多个数据处理管道(pipelines)。在 Logstash 中,一个管道包括输入(input)、过滤器(filter)和输出(output)三个部分。pipelines.yml 文件允许在一个 Logstash 实例中运行多个独立的管道,每个管道可以有自己的输入、过滤器和输出配置。

/usr/local/logstash/config 目录下,编辑 pipelines.yml 文件,配置以下内容:

Terminal window
# 备份原配置文件
cp /usr/local/logstash/config/pipelines.yml{,.bak}
# 修改新配置文件,添加两个管道示例
cat > /usr/local/logstash/config/pipelines.yml <<'EOF'
# pipeline1:处理nginx日志
- pipeline.id: nginx-log
# 指定管道配置文件的路径。每个管道都有自己的配置文件,包含 input、filter 和 output 的具体配置
path.config: "/usr/local/logstash/pipelines/nginx/*.conf"
pipeline.workers: 2
# pipeline2:处理业务应用日志
- pipeline.id: app-log
# 匹配该目录下所有.conf文件,全部合并成同一个 pipeline
path.config: "/usr/local/logstash/pipelines/app/*.conf"
pipeline.workers: 4
EOF

这里先创建了两个管道的基础设置(理解为管道外壳),还缺少具体的处理流程。在后续第4章节会在/usr/local/logstash/pipelines/nginx/目录下创建包含input、filter、output的处理流程文件

常用参数:

Terminal window
- pipeline.id: my-pipeline-1 # 【必选】管道唯一ID,日志里会显示,用于区分不同业务
path.config: "/etc/logstash/conf.d/p1/*.conf" # 【必选】管道加载的配置文件路径,支持通配符
path.queue: "/var/lib/logstash/queue/my-p1" # 持久化队列存储目录,每个pipeline独立队列目录
queue.type: persisted # 队列类型:memory(内存,默认) / persisted(磁盘持久队列,宕机不丢消息)
queue.max_bytes: 4gb # 持久队列最大磁盘占用,达到就阻塞input
queue.checkpoint.writes: 1024 # 每多少条写一次checkpoint磁盘快照
queue.drain: true # 关闭实例时,是否把队列剩余数据消费完成再退出
pipeline.workers: 4 # filter+output 工作线程数,默认CPU核心数
pipeline.batch.size: 125 # 批量大小:每次攒多少条事件交给filter/output处理
pipeline.batch.delay: 50 # 批量等待超时(毫秒):凑不够batch.size最多等多久就提交
pipeline.ordered: auto # 事件顺序:auto(true/false);开启会降低吞吐量,保证事件原始顺序
pipeline.java_execution: true # 使用Java执行引擎(Logstash 8+默认开启)
config.reload.automatic: true # 是否自动监控配置文件变更,重载pipeline
config.reload.interval: 3s # 配置文件扫描间隔
config.debug: false # 打印配置调试信息
dead_letter_queue.enable: true # 开启死信队列DLQ,处理解析失败无法处理的事件
dead_letter_queue.max_bytes: 1gb # DLQ最大占用磁盘
dead_letter_queue.path: "/var/lib/logstash/dlq/my-p1" # DLQ存储路径

2.3.6 配置启动服务#

创建一个名为 logstash.service 的 systemd 服务单元文件,用于管理 Logstash 服务,存放于/usr/lib/systemd/system目录下:

CAP_NET_BIND_SERVICE目的正是使其能够使用 syslog 514 端口(因为1024以下的端口只能root进行监听)

Terminal window
cat > /usr/lib/systemd/system/logstash.service <<'EOF'
[Unit]
Description=logstash
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=elk
Group=elk
# 授予绑定特权端口的能力
AmbientCapabilities=CAP_NET_BIND_SERVICE
# 可选,限制进程可用的能力集合(保持一致)
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
WorkingDirectory=/usr/local/logstash
ExecStart=/usr/local/logstash/bin/logstash --path.settings /usr/local/logstash/config/
Restart=always
Nice=19
LimitNOFILE=16384
TimeoutStopSec=0
[Install]
WantedBy=multi-user.target
EOF
Terminal window
# 重载配置
systemctl daemon-reload
# 启动服务
systemctl start logstash.service

2.4 Beats 组件#

官网地址:https://www.elastic.co/docs/reference/beats/filebeat

安装文档:https://www.elastic.co/docs/reference/beats/filebeat/running-with-systemd

开源地址:https://github.com/elastic/beats/blob/master/filebeat/README.md

下载地址:https://www.elastic.co/cn/downloads/beats

Beats 是 Elastic Stack 提供的一系列轻量级数据采集器,用 Go 语言开发,体积小、资源占用低,部署在业务主机上做数据采集,采集后可输出给 Logstash、Elasticsearch、Kafka。

image-20260901105004889
image-20260901105004889

  1. Filebeat 日志文件采集器,最常用。读取服务器磁盘上的日志文件(nginx、应用程序日志),支持断点续传,日志滚动。
  2. Metricbeat 指标采集器。采集系统指标(CPU、内存、磁盘、网络),也可以采集中间件指标,MySQL、Nginx、Redis 等服务运行指标。
  3. Packetbeat 网络数据包采集器。抓包分析网络流量,解析 TCP/UDP 等协议,统计网络请求、延时、访问情况。
  4. Winlogbeat Windows 专属采集器。专门读取 Windows 系统事件日志,系统安全日志、应用事件日志。
  5. Auditbeat 审计采集器。收集 Linux 系统审计信息,监控文件改动、用户操作行为,用于安全审计。
  6. Heartbeat 状态探测采集器。主动探测服务可用性,检测端口、HTTP 接口是否存活,做服务可用性监控。

2.4.1 FileBeat部署#

下载 Filebeat 二进制包,并指定解压到 /usr/local 目录下,并重命名为 filebeat

Terminal window
cd /usr/local/src
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-9.5.2-linux-x86_64.tar.gz
tar -xf filebeat-9.5.2-linux-x86_64.tar.gz
mv filebeat-9.5.2-linux-x86_64 /usr/local/filebeat

创建数据目录:在 usr/local/elk/data/filebeat 目录下创建两个目录分别为 datalogs ,分别存放数据和日志:

Terminal window
mkdir -p /usr/local/elk/data/filebeat/{data,logs}

2.4.2 修改FileBeat配置文件#

filebeat.yml 是 Filebeat 主要的配置文件,包含了很多参数信息。在 /usr/local/filebeat 目录下,编辑 filebeat.yml 文件,配置以下内容:(这里配置采集的数据直接发给ES,不经过Logstash

Terminal window
# 备份原配置文件
cp /usr/local/filebeat/filebeat.yml{,.bak}
# 修改新配置文件
cat > /usr/local/filebeat/filebeat_es.yml <<'EOF'
# ============================== 1. 输入源配置 (Inputs) ==============================
# 定义 Filebeat 需要采集的日志来源
filebeat.inputs:
- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转
id: my-messages-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度
enabled: true # 启用状态:设置为 true 表示开启此采集规则
paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)
- /var/log/messages # 此处指定采集 Linux 系统的 messages 日志
# ============================== 2. 索引模板配置 (Template) ==============================
setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称
setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)
setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效
# ============================== 3. 模块配置 (Modules) ==============================
# 控制 Filebeat 预置模块的加载行为
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录
reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效
# ============================== 4. 输出配置 (Output) ==============================
# 定义采集到的日志数据最终发送到的目的地
output.elasticsearch:
hosts: ["https://localhost:9200"] # ES 集群地址:Elasticsearch 节点的 IP 和端口
index: "test-%{+yyyy.MM.dd}" # 自定义索引名:按天生成索引,例如 test-2026.09.01
# --- SSL/TLS 加密与认证配置 ---
ssl.verification_mode: none # 证书验证模式:none 表示不验证服务端证书(适用于自签名证书环境)
ssl.certificate_authorities: # CA 证书路径:指定用于验证 ES 服务端证书的根证书文件路径
- "/usr/local/elasticsearch/config/certs/http_ca.crt"
# --- 访问凭证 ---
username: "elastic" # 认证用户名:连接 Elasticsearch 所需的账号
password: "admin@123" # 认证密码:连接 Elasticsearch 所需的密码(️ 生产环境建议使用 Keystore 加密)
EOF

默认模板简化

Terminal window
# ====================== 输入源配置 ======================
filebeat.inputs:
# 文件流输入:采集本地日志文件
- type: filestream
id: my-filestream-id # 输入项唯一ID
enabled: false # 是否启用该输入
paths: # 待采集日志路径,支持通配符
- /var/log/*.log
#exclude_lines: ['^DBG'] # 排除匹配正则的日志行
#include_lines: ['^ERR', '^WARN'] # 只采集匹配正则的日志行
#prospector.scanner.exclude_files: ['.gz$'] # 排除匹配的文件
#fields: # 自定义附加字段
# level: debug
# review: 1
# journald输入:采集系统journald日志
#- type: journald
# id: my-journald-id # 输入项唯一ID
# seek: head # 读取起始位置:head开头/tail尾部/since指定时间
# since: -24h # 起始时间偏移(seek=since时生效)
# units: # 指定采集的systemd服务
# - docker.service
# ====================== 模块配置 ======================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml # 模块配置文件路径
reload.enabled: false # 是否开启配置热重载
#reload.period: 10s # 配置文件检查周期
# ====================== ES索引模板 ======================
setup.template.settings:
index.number_of_shards: 1 # 索引分片数量
#index.codec: best_compression # 索引压缩编码
#_source.enabled: false # 是否关闭_source字段存储
# ====================== 通用配置 ======================
#name: # 采集器标识名称
#tags: ["service-X", "web-tier"] # 全局标签,用于分类过滤
#fields: # 全局附加字段
# env: staging
# ====================== Kibana配置 ======================
setup.kibana:
#host: "localhost:5601" # Kibana服务地址
#space.id: # Kibana空间ID
# ====================== Elastic Cloud ======================
#cloud.id: # Cloud实例ID,覆盖ES/Kibana地址
#cloud.auth: # Cloud认证,格式 user:pass
# ====================== 输出配置 ======================
# Elasticsearch输出
output.elasticsearch:
hosts: ["localhost:9200"] # ES节点地址列表
preset: balanced # 性能预设:balanced/throughput/scale/latency/custom
#protocol: "https" # 通信协议
#api_key: "id:api_key" # API密钥认证
#username: "elastic" # 用户名认证
#password: "changeme" # 密码认证
# Logstash输出
#output.logstash:
# hosts: ["localhost:5044"] # Logstash地址列表
# ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] # CA根证书
# ssl.certificate: "/etc/pki/client/cert.pem" # 客户端证书
# ssl.key: "/etc/pki/client/cert.key" # 客户端私钥
# ====================== 数据处理器 ======================
processors:
- add_host_metadata:
when.not.contains.tags: forwarded # 无forward标签时添加主机元数据
- add_cloud_metadata: ~ # 添加云环境元数据
- add_docker_metadata: ~ # 添加Docker容器元数据
- add_kubernetes_metadata: ~ # 添加K8s元数据
# ====================== 自身日志 ======================
#logging.level: debug # 日志级别:error/warning/info/debug
#logging.selectors: ["*"] # 启用日志的组件
# ====================== X-Pack监控 ======================
#monitoring.enabled: false # 是否开启监控上报
#monitoring.cluster_uuid: # 监控集群UUID
#monitoring.elasticsearch: # 监控专用ES集群配置
# ====================== 链路追踪 ======================
#instrumentation:
# enabled: false # 是否启用APM埋点
# environment: "" # 运行环境
# hosts: # APM Server地址
# - http://localhost:8200
# api_key: # APM API密钥
# secret_token: # APM密钥令牌
# ====================== 版本迁移 ======================
#migration.6_to_7.enabled: true # 启用6.x到7.x迁移别名

2.4.3 配置测试#

Terminal window
# 测试配置文件语法是否正确
[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test config
Config OK
# 测试能否连通 Elasticsearch
[root@localhost /]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml test output
elasticsearch: https://localhost:9200...
parse url... OK
connection...
parse host... OK
dns lookup... OK
addresses: 127.0.0.1, 127.0.1.1, ::1
dial up... OK
TLS...
security... WARN server's certificate chain verification is disabled
handshake... OK
TLS version: TLSv1.3
dial up... OK
talk to server... OK
version: 9.5.2
# 前台运行查看实时日志(确认没有报错)
/usr/local/filebeat/filebeat -e -c /usr/local/filebeat/filebeat.yml

2.4.4 配置启动服务#

创建一个名为 filebeat.service 的 systemd 服务单元文件,用于管理 Filebeat 服务,存放于/usr/lib/systemd/system目录下:

Terminal window
cat > /usr/lib/systemd/system/filebeat.service <<'EOF'
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Documentation=https://www.elastic.co/beats/filebeat
Wants=network-online.target
After=network-online.target
[Service]
UMask=0027
Environment="GODEBUG='madvdontneed=1'"
Environment="BEAT_LOG_OPTS="
Environment="BEAT_CONFIG_OPTS=-c /usr/local/filebeat/filebeat.yml"
Environment="BEAT_PATH_OPTS=--path.home /usr/local/filebeat --path.config /usr/local/filebeat --path.data /usr/local/elk/data/filebeat/data --path.logs /usr/local/elk/data/filebeat/logs"
ExecStart=/usr/local/filebeat/filebeat --environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS
Restart=always
[Install]
WantedBy=multi-user.target
EOF
Terminal window
# 重载配置
systemctl daemon-reload
# 启动服务
systemctl start filebeat.service

三、Kibana组件使用#

官方中文文档:Kibana 用户手册 | Elastic

3.1添加数据视图#

由于之前部署Beats组件时将采集的数据发送到ES,且在配置中自定义了索引名称(test-%{+yyyy.MM.dd}),Kibana 默认不会自动显示它。

3.1.1 确认数据已成功写入ES#

在去 Kibana 之前,建议先在终端确认数据确实已经写进去了:

能看到类似 test-2026.09.01 的索引,说明数据已成功写入

Terminal window
# 先写入数据
echo "你好世界" >> /var/log/messages
# 检查是否存在以 test- 开头的索引
curl -k -u elastic:sunline https://localhost:9200/_cat/indices?v | grep test-
# 结果如下:
[root@localhost /root]# curl -k -u elastic:admin@123 https://localhost:9200/_cat/indices?v | grep test-
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 780 0 780 0 0 13088 0 --:--:-- --:--:-- --:--:-- 13220
yellow open test-2026.09.01 sBBj_X_ISgm0HELW1Wl6XQ 1 1 7 0 56.4kb 56.4kb 56.4kb

3.1.2 在Kibana中创建数据视图#

  1. 打开浏览器,访问 Kibana 界面(默认地址:https://<Kibana服务器IP>:5601),使用 elastic/admin@123 登录。

  2. 在左侧菜单栏,向下滚动找到 Management点击进入

    image-20260901155359207
    image-20260901155359207

  3. 进入后找到Kibana下的数据视图点击,进入后选择创建数据视图

    image-20260901155505367
    image-20260901155505367

  4. 索引模式填入**test-***与Filebeat 配置中的 test-%{+yyyy.MM.dd} 相匹配,点击保存

    image-20260901155703959
    image-20260901155703959

  5. 可以看到监控的一些字段数据

    image-20260901161840335
    image-20260901161840335

3.2 使用Discover模块查看数据#

image-20260901164129653
image-20260901164129653

image-20260901163954607
image-20260901163954607

3.3 创建可视化图表#

image-20260901164147147
image-20260901164147147

image-20260901170213691
image-20260901170213691

可以添加图层

image-20260901170546536
image-20260901170546536

最后点击保存并添加到库中

image-20260901171634120
image-20260901171634120

3.4 创建仪表盘#

image-20260901173203536
image-20260901173203536

image-20260901173254285
image-20260901173254285

可选择新建、或者使用库中的图标

image-20260901173341737
image-20260901173341737

image-20260901173503647
image-20260901173503647

最后的效果:

image-20260901173522414
image-20260901173522414


四、Logstash组件使用#

这里使用一个案例来阐述Logstash组件的基本使用:监控nginx的日志文件,这次Filebeat的链路走向不直接对接ES,而是先交给Logstash进行过滤清洗,然后再交给ES。整个链路走向为 Filebeat → Logstash → Elasticsearch 。最后在 Kibana 中完成可视化

4.1 配置 Logstash#

Logstash 负责接收 Filebeat 的数据,解析 Nginx 日志格式,然后写入 ES。

  1. 在 Logstash 的配置目录下创建或修改配置文件。(根据2.3的管道示例,这里需要在/usr/local/logstash/pipelines/nginx目录下创建配置文件

    Terminal window
    # 创建目录
    mkdir -p /usr/local/logstash/pipelines/nginx/
  2. 配置 Input 接收 Filebeat 数据,Filter 解析日志,Output 写入 ES:

Terminal window
cat > /usr/local/logstash/pipelines/nginx/nginx-log.conf << 'EOF'
input {
beats {
port => 5044 # 监听端口,需与 Filebeat 配置一致
}
}
filter {
# 使用 Grok 插件解析非结构化的 Nginx 访问日志
grok {
match => {
"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}'
}
break_on_match => false
}
}
output {
elasticsearch {
hosts => ["https://localhost:9200"] # ES 地址
index => "nginx-logs-%{+YYYY.MM.dd}" # 按天生成索引
# 如果 ES 开启了安全认证,需加上用户名和密码
user => "elastic"
password => "admin@123"
ssl_verification_mode => "none" # 不验证证书
}
}
EOF
Terminal window
# 修改用户所有权
chown -R elk:elk /usr/local/logstash
# 重启
systemctl restart logstash.service
# 查看5044端口是否开启监听
netstat -tunlp | grep 5044

4.2 配置 Filebeat#

Filebeat 部署在 Nginx 所在的服务器,负责实时采集日志并推送到 Logstash。

  1. 修改 Filebeat 的配置文件 filebeat.yml

  2. 配置输入源(Nginx 日志路径)和输出目标(Logstash):

    因在2.4.2配置过一个将采集的日志直接发送到ES,这里直接去掉,保留的话可以查看后面的另一个流程

Terminal window
# 备份之前的文件
cp /usr/local/filebeat/filebeat.yml{,.bak.bak}
# ============================== 1. 输入源配置 (Inputs) ==============================
# 定义 Filebeat 需要采集的日志来源
filebeat.inputs:
- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转
id: my-nginx-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度,ID不可与其他输入源重复
enabled: true # 启用状态:设置为 true 表示开启此采集规则
paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)
- /var/log/nginx/*.log # 需要采集的日志路径,请修改为实际日志文件
# ============================== 2. 索引模板配置 (Template) ==============================
# 当前输出为Logstash,模板配置不会生效,保留配置文件结构不删除
setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称
setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)
setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效
# ============================== 3. 模块配置 (Modules) ==============================
# 控制 Filebeat 预置模块的加载行为
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录
reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效
# ============================== 4. 输出配置 (Output) ==============================
# 定义采集到的日志数据最终发送到的目的地
output.logstash:
hosts: ["127.0.0.1:5044"] # Logstash 地址端口,请修改为你的实际 Logstash 服务地址
EOF

保留多个采集源:#

将两路日志全部推送到 logstash 的 5044 端口,依靠 fields.dest 字段区分。在 Logstash 里面做分流(messages 不处理直接进 ES,nginx 日志在 logstash的filter字段 处理后进入ES)

1. filebeat配置#

Terminal window
cat > /usr/local/filebeat/filebeat.yml << 'EOF'
# ============================== 1. 输入源配置 (Inputs) ==============================
# 定义 Filebeat 需要采集的日志来源
filebeat.inputs:
- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转
id: my-messages-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度
enabled: true # 启用状态:设置为 true 表示开启此采集规则
paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)
- /var/log/messages # 此处指定采集 Linux 系统的 messages 日志
fields:
dest: "es" # 自定义标记字段:用于Logstash内部分流,该路日志发送到 Elasticsearch
# ========== 追加第二个采集源:nginx日志 ==========
- type: filestream # 采集类型:推荐使用 filestream,它比旧版的 log 类型更稳定,能更好地处理日志轮转
id: my-nginx-log # 唯一标识符:为当前输入源分配一个固定的 ID,确保重启后能准确追踪读取进度,ID不可与其他输入源重复
enabled: true # 启用状态:设置为 true 表示开启此采集规则
paths: # 采集路径:指定要读取的日志文件或目录(支持通配符)
- /var/log/nginx/*.log # 需要采集的日志路径,请修改为实际日志文件
fields:
dest: "logstash" # 自定义标记字段:用于Logstash内部分流,该路日志留在logstash处理
# ============================== 2. 索引模板配置 (Template) ==============================
setup.template.name: "my-log" # 模板名称:在 Elasticsearch 中创建的索引模板的名称
setup.template.pattern: "my-log-*" # 模板匹配模式:指定该模板应用于哪些索引(通常与自定义索引前缀对应)
setup.ilm.enabled: false # 关闭 ILM(索引生命周期管理):防止 ES 自动接管索引命名,确保下方的自定义索引名生效
# ============================== 3. 模块配置 (Modules) ==============================
# 控制 Filebeat 预置模块的加载行为
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml # 模块配置路径:指定预置模块配置文件所在的目录
reload.enabled: false # 动态重载:设置为 false 表示不自动检测模块配置的变更,需重启生效
# ============================== 4. 输出配置 (Output) ==============================
# 定义采集到的日志数据最终发送到的目的地
# Filebeat只允许一个output,全部数据发送给Logstash,分流逻辑交给Logstash
output.logstash:
hosts: ["127.0.0.1:5044"] # Logstash 地址端口,请修改为你的实际 Logstash 服务地址
EOF

2. nginx-log.conf配置#

Terminal window
cat > /usr/local/logstash/pipelines/nginx/nginx-log.conf << 'EOF'
input {
beats {
port => 5044
}
}
filter {
# 只对 Nginx 日志做 grok 解析(通过 dest 字段区分),避免系统日志匹配失败
if [fields][dest] == "logstash" {
grok {
match => {
"message" => '%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] "%{WORD:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer}) %{QS:agent}'
}
break_on_match => false
}
}
# 如果你也想解析 messages 日志,可以再增加一个 grok,但此处不需要
}
output {
# 分流:dest=es 的日志(messages)写入 test-* 索引
if [fields][dest] == "es" {
elasticsearch {
hosts => ["https://localhost:9200"]
index => "test-%{+yyyy.MM.dd}"
user => "elastic"
password => "admin@123"
ssl_verification_mode => "none" # 统一使用 8.x 写法,更简洁
# 如果你的 Logstash 版本较旧,可换为:
# ssl_certificate_verification => false
}
}
# 分流:dest=logstash 的日志(nginx)写入 nginx-log-* 索引
else if [fields][dest] == "logstash" {
elasticsearch {
hosts => ["https://localhost:9200"]
index => "nginx-log-%{+yyyy.MM.dd}" # 统一用小写 yyyy,避免跨年周问题
user => "elastic"
password => "admin@123"
ssl_verification_mode => "none"
}
}
# 可选:调试时打开下面的 else,查看未匹配 dest 的事件(生产环境请注释掉)
# else {
# stdout { codec => rubydebug }
# }
}
EOF

之后回到kibana进行数据视图、可视化图表、仪表盘的创建(具体步骤可参考第三章节


五、APM server组件#

Elastic APM Server 是 Elastic Stack(ELK Stack)中专门用于接收、处理和转发应用性能监控(APM)数据的组件。

简单来说,它充当了**应用程序(Agent)**与 **Elasticsearch(存储/分析引擎)**之间的“网关”或“缓冲层”。

  • 核心功能:它接收来自各种编程语言 APM Agent 发送的性能数据(如 HTTP 请求耗时、数据库查询、错误日志、分布式追踪 Trace 等)。
  • 数据处理:它对原始数据进行验证、转换和丰富(例如添加 GeoIP 信息、User-Agent 解析等),然后将其转换为 Elasticsearch 文档格式。
  • 缓冲与解耦:它防止大量监控数据直接冲击 Elasticsearch 集群,起到削峰填谷的作用,同时让应用程序无需关心后端的存储细节。
  • 架构演进注意:在 Elastic Stack 8.x 及更高版本中,APM Server 已经不再是一个必须独立部署的二进制文件,而是被集成到了 Elastic Agent 中作为一个托管服务运行。但在逻辑上,它的功能依然存在。

5.1 搭配的组件#

  1. APM Agent(探针)【必须】 部署在业务应用侧,不是 APM‑Server。
    • 各语言 SDK:Java Agent、Python、Go、NodeJS、.NET、PHP 等
    • 作用:采集应用指标、调用链路、错误堆栈、慢请求,把数据上报给 APM Server。
    • Agent 只负责采集上报,不存储数据
  2. APM Server【中间转发服务】 接收 Agent 发过来的链路数据,做预处理、解析、字段增强,再写入 Elasticsearch。 两种部署:二进制、docker。
  3. Elasticsearch【存储,必须】 APM Server 所有链路、指标、异常数据最终全部写入 ES 索引,没有 ES 就无法持久化。
  4. Kibana【可视化,必须】 提供 APM 专属 UI 面板:服务地图、链路详情、慢事务、错误统计、服务指标,做查询、告警、图表展示。

5.1.1 可选组件#

  • Fleet Server / Elastic Agent(8.x+ 推荐):用于集中管理和部署 APM Server 集成,简化运维。
  • Logstash:如果你需要在数据进入 ES 之前进行复杂的自定义 ETL 处理,可以让 APM Server 输出到 Logstash 而非直接写入 ES。
  • Kafka / Redis:作为中间消息队列,当数据量极大时,可置于 APM Server 与 Elasticsearch 之间提供额外的缓冲能力。
  • Machine Learning:Elastic 内置的 ML 功能可以对 APM 数据进行异常检测(如响应时间突增、流量异常等)。

最简最小组合:业务应用 + APM Agent + APM Server + Elasticsearch + Kibana

如果使用的是 Elastic Stack 8.x 或更新版本,官方推荐使用 Fleet + Elastic Agent 的方式来部署 APM Server,而不是手动下载独立的 apm-server 二进制包。这种方式支持通过 Kibana UI 进行集中配置、升级和监控,大幅降低了运维复杂度。


六、Fleet组件使用#

Fleet 由两部分组成:

  • Fleet UI 是一个带有可视化界面的 Kibana 应用程序,用户可以在界面配置和管理 Elastic Agent 的策略,并且在 Fleet 页面上查看所有 Elastic Agent 的状态。
  • Fleet Server 负责集中管理 Elastic Agent 的策略和生命周期,它提供了用于更新 Elastic Agent 的控制平面,并指示 Elastic Agent 执行一些操作,例如更新监控策略,跨主机运行 Osquery 或在网络层隔离主机以遏制安全威胁。Fleet Server 也是一个特殊的 Elastic Agent。

打开kibana的UI界面,进入Fleet(左侧菜单 → Management → Fleet):(如果进入后出现如下界面

image-20260903141521762
image-20260903141521762

这是因为Kibana 的 kibana.yml 里没有配置加密密钥

Terminal window
# 1. 生成随机字符串作为秘钥
openssl rand -hex 32
# 输出结果:
a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8
# 2. 将秘钥填入字段,之后将以下内容追加到kiban的配置文件中
cat >> /usr/local/kibana/config/kibana.yml << 'EOF'
# 用于加密 Fleet 的 enrollment token、API key 等敏感 saved object
xpack.encryptedSavedObjects.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"
# 以下两个是 9.x 强烈建议一并配置的(Alerting / Actions / Security Solution 也依赖)
xpack.reporting.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"
xpack.security.encryptionKey: "a3f1c9e8b7d24f6a1c0e9b8d7f6a5c4e3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8"
EOF
# 3. 重启kibana
systemctl restart kibana

出现如下画面说明fleet可以正常使用了

image-20260903142210608
image-20260903142210608

6.1 创建Fleet服务器#

6.1.1 快速创建#

填写名称和URL,点击继续

其中URL填写的是fleet服务器的URL,后续elastic agent就是通过这个找到fleet server

如果要修改端口,那么后续安装fleet server的命令也需要修改,默认给出的命令是8220端口

image-20260903143145479
image-20260903143145479

在上一步点击确认后自动生成代理策略和注册令牌,会出现以下命令,选择对应的架构安装对应的elastic agent,这里在主机(10.22.51.91)上进行安装·fleet 服务器

image-20260903150933223
image-20260903150933223

image-20260903143447176
image-20260903143447176

Terminal window
# 进入下载目录
cd /usr/local/src
curl -L -O https://artifacts.elastic.co/downloads/beats/elastic-agent/elastic-agent-9.5.2-linux-x86_64.tar.gz
tar xzf elastic-agent-9.5.2-linux-x86_64.tar.gz
mv elastic-agent-9.5.2-linux-x86_64 /usr/local/elastic-agent
cd /usr/local/elastic-agent
# 执行命令
./elastic-agent install \
--fleet-server-es=https://10.22.51.91:9200 \
--fleet-server-service-token=AAEAAWVsYXN0aWMvZmxlZXQtc2VydmVyL3Rva2VuLTE3ODg0MTcxNjU2MTg6WDhsOXVJUmhReGVVZnB5NnBoeUtjZw \
--fleet-server-policy=fleet-server-policy \
--fleet-server-es-ca-trusted-fingerprint=7fc5dc32cf288606da9eab53fe5503efe8ae4d2340e72e3180687e3c11cd54dd \
--fleet-server-port=8220 \
--install-servers
# 出现以下结果:输入y,会向fleet服务器下载配置文件,并安装在/opt/Elastic/Agent
Elastic Agent will be installed at /opt/Elastic/Agent and will run as a service. Do you want to continue? [Y/n]:y
[ ] Service Started [48s] Elastic Agent successfully installed, starting enrollment.
[== ] Waiting For Enroll... [50s] {"log.level":"info","@timestamp":"2026-09-03T15:12:15.206+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).prepareFleetTLS","file.name":"cmd/enroll_cmd.go","file.line":373},"message":"Generating self-signed certificate for Fleet Server","ecs.version":"1.6.0"}
[== ] Waiting For Enroll... [51s] {"log.level":"info","@timestamp":"2026-09-03T15:12:16.007+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff","file.name":"cmd/enroll_cmd.go","file.line":417},"message":"Restarting agent daemon, attempt 0","ecs.version":"1.6.0"}
[ ===] Waiting For Enroll... [53s] {"log.level":"info","@timestamp":"2026-09-03T15:12:18.018+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1","file.name":"cmd/enroll_cmd.go","file.line":613},"message":"Fleet Server - waiting for output unit","ecs.version":"1.6.0"}
[ ===] Waiting For Enroll... [1m5s] {"log.level":"info","@timestamp":"2026-09-03T15:12:30.030+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.waitForFleetServer.func1","file.name":"cmd/enroll_cmd.go","file.line":594},"message":"Fleet Server - Running on policy with Fleet Server integration: fleet-server-policy; missing config fleet.agent.id (expected during bootstrap process)","ecs.version":"1.6.0"}
[ ===] Waiting For Enroll... [1m5s] {"log.level":"info","@timestamp":"2026-09-03T15:12:30.808+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/application/enroll.EnrollWithBackoff","file.name":"enroll/enroll.go","file.line":87},"message":"Starting enrollment to URL: https://localhost:8221/","ecs.version":"1.6.0"}
[== ] Waiting For Enroll... [1m8s] {"log.level":"info","@timestamp":"2026-09-03T15:12:33.543+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).daemonReloadWithBackoff","file.name":"cmd/enroll_cmd.go","file.line":417},"message":"Restarting agent daemon, attempt 0","ecs.version":"1.6.0"}
{"log.level":"info","@timestamp":"2026-09-03T15:12:33.546+0800","log.origin":{"function":"github.com/elastic/elastic-agent/internal/pkg/agent/cmd.(*enrollCmd).Execute","file.name":"cmd/enroll_cmd.go","file.line":206},"message":"Successfully triggered restart on running Elastic Agent.","ecs.version":"1.6.0"}
Successfully enrolled the Elastic Agent.
[== ] Done [1m8s]
Elastic Agent has been successfully installed.

回到kibana界面,发现已经连接成功

image-20260903151406137
image-20260903151406137

image-20260903152259622
image-20260903152259622

6.1.2 高级选项创建#

高级创建有更多的选项可自定义,更加灵活。这次安装fleet server使用另一台独立的机器10.22.51.74,不再与elastic组件服务器(10.22.51.91)安装在一起

这里事先创建了两个不同的代理策略,指定不同的fleet server,供不同的fleet srever使用

image-20260909093243768
image-20260909093243768

之后选择部署模式和fleet服务器主机

image-20260909093540993
image-20260909093540993

最后生成令牌,将fleet 服务器安装到对应ip(10.22.51.74)中

image-20260909093656392
image-20260909093656392

6.2 代理策略使用#

6.2.1 代理策略概念#

代理策略 = 配置模板,里面定义采集什么日志、指标、输出给谁。 业务机器安装 Elastic Agent 的时候,绑定某一个策略,Agent 就自动下载这套配置,不需要去业务机器改配置文件。

6.2.2 默认代理策略#

Fleet Server Policy专门给 Fleet‑Server 服务端用,普通业务 agent 绝对不要选它(已经有 1 个代理绑定它,就是之前的 fleet‑server 节点)

如果有多个fleet server使用不同的代理策略,建议修改代理策略的名字。同时修改策略使用的fleet 服务器(不修改则为默认)。否则将出现fleet server无法更新

对于其他的策略需要指定其需要通信的fleet server,否则使用的是默认的fleet server地址。

image-20260909094435687
image-20260909094435687

image-20260909094450672
image-20260909094450672

6.2.3 创建普通代理策略#

  • 点右上角【创建代理策略】新建空白策略,填写名称后点击创建

    image-20260904154851809
    image-20260904154851809

    image-20260904155019636
    image-20260904155019636

6.2.4 进入策略页面#

可以看到有个默认的system集成,这是因为之前创建时勾选了收集系统日志和指标

  1. 添加集成:比如 Nginx、System (系统指标)、Filebeat 自定义日志、MySQL 等。这里添加nginx的集成

    添加集成就是告诉 Agent:要采集什么数据。 例如nginx监控策略这个策略,添加 Nginx 集成来采集nginx的数据。

    image-20260904155416256
    image-20260904155416256

    image-20260904162739761
    image-20260904162739761

关键点:只要网页修改策略保存,所有绑定这个策略的 Agent,会自动拉取新配置,不需要登录业务机器重启 agent!Fleet 的核心价值就在这里,集中管理。

6.3 代理策略选项#

image-20260904163308647
image-20260904163308647

6.3.1 添加 Fleet 服务器#

只针对 Fleet Server Policy 才有用,普通业务策略不要点! 功能:弹出向导,生成 Fleet‑Server 安装脚本,就是你最开始部署 fleet‑server 那套 install 命令。

  • 作用:用于部署第二台、多台 Fleet‑Server 节点做高可用。

nginx监控策略 普通策略点这个是无效的,普通策略不能用来安装 Fleet‑Server。

6.3.2 添加代理#

  1. 点击直接跳转到 Agent 安装向导,并且自动选定当前策略
  • 系统直接生成安装脚本,脚本内置绑定此策略。
  • 复制脚本到业务服务器执行安装 elastic‑agent。

image-20260904164318678
image-20260904164318678

6.3.3 在此策略上升级代理#

批量升级该策略下全部 Agent 版本

  • 当 Kibana 检测到有新版本 Elastic‑Agent 可用,这个按钮激活。
  • 一键把所有绑定此策略的 agent,远程升级到新版本,不需要登录业务机器操作

6.3.4 在此策略上卸载代理#

批量远程卸载该策略下所有 Agent。 触发后,Kibana 下发指令,所有绑定该策略机器上的 elastic‑agent 执行卸载,停止服务、删除程序。

6.4 集成修改#

image-20260904164939906
image-20260904164939906

当选择的集成采集的数据不符合要求时,可以编辑集成进行自定义

6.5 创建代理#

image-20260904165133234
image-20260904165133234

  1. 选择代理策略:nginx监控策略

    image-20260904165750887
    image-20260904165750887

  2. 选择在fleet中注册

    image-20260904165828303
    image-20260904165828303

  3. 在被监控的主机10.22.51.72中执行命令

    image-20260904165915976
    image-20260904165915976

    image-20260904170939979
    image-20260904170939979

七、Elastic Agent#

Elastic Agent 是 Elastic 官方推出的统一数据采集与管理代理,用来替代过去散落的 Beats 家族(Filebeat、Metricbeat、Packetbeat、Heartbeat、Auditbeat、Winlogbeat…)以及独立的 APM Server,把它们的能力收敛到一个二进制、一个进程、一套配置里。

Elastic Agent = 一个跑在每台主机/容器上的”全能采集器”,由 Kibana Fleet 远程统一管理,按需开启日志、指标、APM、安全、合成监控等各种能力。

参考文档:Elastic Stack 实战教程 4:使用 Fleet 管理 Elastic Agent 监控应用 - 墨天轮

安装独立的 Elastic Agents 并采集数据 - Elastic Stack 8.0_copy this policy to the elastic-agent.yml on the h-CSDN博客

Observability:使用 Elastic Agent 来摄入日志及指标 - Elastic Stack 8.0-CSDN博客

7.1 基本认识#

7.1.1 核心组件和概念#

概念作用类比
Elastic Agent跑在被监控机器上的实际进程,负责采集和上报”士兵”:执行采集数据的角色
Integration(集成)一个个可插拔的能力包,如 System、Nginx、MySQL、Elastic APM、Endpoint Security”技能卡”:规定采集哪些数据
Agent Policy(代理策略)一组集成的集合 + 输出配置,决定”这个 Agent 要干什么""任务清单”
Fleet / Fleet ServerKibana 里的管理中心 + 通信中转,把策略下发给所有 Agent”指挥部”

工作流:

  1. 你在 Kibana Fleet UI 里创建一个 Policy(代理策略),往里加几个 Integration(集成)(比如 System + Nginx + APM)。
  2. Fleet Server 把这份 Policy 推送给所有挂在该 Policy 下的 Elastic Agent。
  3. Agent 热加载新配置,立刻开始按新策略采集,无需重启、无需登录机器
  4. 数据写入 Elasticsearch,在 Kibana 里查看。

7.1.2 核心能力#

Elastic Agent 通过加载不同的 Integration(集成) 覆盖几乎所有观测与安全场景:

领域典型 Integration替代的老组件
日志System logs、Nginx、Apache、Kafka、Docker、Kubernetes、自定义文件/JSON/SyslogFilebeat
指标System metrics、CPU/Memory/Disk、Prometheus scrape、各种中间件 metricsMetricbeat
APMElastic APM独立 APM Server
可用性监控HTTP/TCP/ICMP 探活Heartbeat
合成监控Browser journeys(Playwright 脚本)Synthetics
安全 / EDRElastic Defend(Endpoint Security)、Auditd、OsqueryAuditbeat + Endpoint
网络Flow、Packet capturePacketbeat
AWS、Azure、GCP 全套服务指标和日志各 cloud beat

在 Elastic 官方的 Integrations 市场里目前有 300+ 个开箱即用的集成,点几下就能启用。

7.1.3 流程详情#

image-20260903164440901
image-20260903164440901

  • 主进程根据 Fleet 下发的 Policy,动态拉起/停止若干子 component(很多其实就是内嵌的 Beat 或 APM Server 逻辑)。
  • 与 Fleet Server 之间维持长连接,实时接收策略变更、上报自身健康状态。
  • 所有 component 共享同一个输出管道(ES / Logstash / Kafka),统一背压和重试。

7.1.4 运行模式#

模式说明适用场景
Fleet-managed(推荐)由 Kibana Fleet 远程管理,UI 点点鼠标即可改配置生产环境、规模化部署
Standalone(独立)不连 Fleet,本地用 elastic-agent.yml 配置离线环境、极简场景、调试

99% 的场景都应该用 Fleet-managed,也就是你前两轮在做的方向。

7.1.4.1 模式特性#

特性FleetStandalone
中央管理支持不支持
Kibana UI支持部分
Agent Policy核心机制本地配置
Integration支持
大规模 Agent推荐不推荐
自动配置下发支持不支持
集中升级支持手工
配置文件Fleet生成自己维护
学习难度
生产环境推荐特殊场景
Ansible 管理可结合很适合

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

Elastic Stack部署使用
https://2233941.xyz/posts/Elastic Stack部署使用/
作者
lumifly
发布于
2026-09-03
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
lumifly
不逐世间万丈星河,自守一隅细碎明光
✨ 今日一言
" 加载中... "
——
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
本年还剩 -- --%
本月还剩 -- --%
本周还剩 -- --%
距离--
--
--
天气预报
站点统计
文章
25
分类
1
标签
19
总字数
169,017
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.12.1
文章许可
CC BY-NC-SA 4.0

文章目录